'''
Created on 16 mars 2011

@author: wp803469

    Synthese de Fourier, question 1.4
    Tout est indique dans le main

'''

from math import pi,sin
import numpy
import math
import matplotlib.pylab as pylab


# ------------------------- pour la question 1.4.1 -----------------------------

def signalTfrequentiel(a0=0.5,an=(4/(pi*pi)) , f0=1, nb_harmoniques=2, pas=0.01, Te=4):
    '''
    representation frequentielle (spectre) du signal T
    '''
    x = numpy.arange(0,Te,pas)
    s = []
    
    # pour chaque valeur de t
    for t in x:
        sigma = 0
        # je m'occupe de la somme
        for i in range(nb_harmoniques - 1):
            sigma += math.cos(2 * pi * (2 * i + 1) * f0 * t) / ((2 * i + 1) * (2 * i + 1))
        sn = a0 + an * sigma
        s.append(sn)
    pylab.xlim([-2*f0, 2*f0])
    pylab.ylim([-2, 2])
    pylab.plot(x,s,'b.')
    pylab.show()



# ------------------------- pour la question 1.4.2 -----------------------------

def signalR(Te=4, pas=0.01, nb_harmoniques=7, f0=1):
    '''
    representation du spectre du signal R
    '''
    x = numpy.arange(0,Te+pas,pas)
    s = []
    
    # pour chaque valeur de t
    for t in x:
        sigma = 0
        # je m'occupe de la somme de 1 a nb_harmoniques
        for i in range(nb_harmoniques):
            sigma += math.sin(2 * pi * f0 * (i + 1) * t) / (i + 1) 
        sn = (-2 / pi) * sigma
        s.append(sn)
    pylab.plot(x,s,'b.')
    #pylab.show()
    
def repSpectreSignalR():
    '''
    s'occupe de faire une jolie presentation du graphe de signalR
    '''
    pylab.subplots_adjust(hspace=0.5)
    pylab.subplot(7,1,1)
    for i in range(7):
        pylab.subplot(7,1,(i+1))
        signalR(Te=1, pas=0.01, nb_harmoniques=(i+1))
    pylab.show()



# ------------------------- pour la question 1.4.3 -----------------------------

def dirac(x):
    '''
    j'en ai besoin pour la representation frequentielle:
    retourne 1 si x est nulle
    0 sinon
    '''
    print "x=",x
    if(x == 0):
        #print "jackpot !"
        return 1
    else:
        return 0

def spectre_C(f0=2, pas=1, nb_harmoniques=7):
    '''
    representation frequentielle du signal C (verifier)
    '''
    x = numpy.arange(-2*f0, +2*f0+pas, pas)
    s = []
    for f in x:
        sigma = 0
        for n in range(nb_harmoniques):
            print "n",n
            dirac_res = dirac(f - (2*n+1)*f0)
            sigma += - dirac_res / (2*n+1)
            print "sigma=",sigma
        print "sigma final=",sigma
        print "S(",f,")=",(sigma*(2/pi))
        s.append(sigma * (2/pi))
    pylab.xlim([-2*f0, 2*f0])
    pylab.plot(x,s, 'b.')
    pylab.show()

def rep_temporelle_C(nb_harmoniques=3, f0=1):
    '''
    representation temporelle du signal C
    '''
    x = numpy.arange(0,4,0.01)
    s = []
    
    # pour chaque valeur de t
    for t in x:
        sigma = 0
        for i in range(nb_harmoniques - 1):
            sigma += ((math.sin(2 * pi * (2 * i + 1) * f0 * t) / ((2 * i + 1) * (2 * i + 1))) * 4) / (pi * (2 * i + 1))
        s.append(sigma)
    pylab.plot(x,s,'b.')
    pylab.show()
    


def main():
    # question 1.4.1: representation du spectre du signal T
    #signalTfrequentiel(nb_harmoniques=7)
    
    # question 1.4.2: meme chose avec le signal R
    #repSpectreSignalR()

    # question 1.4.3: on deduit le signal a partir de son spectre
    spectre_C() # spectre du signal
    #rep_temporelle_C() # representation temporelle du signal
    pass


if __name__ == '__main__':
    main()
    
    